package com.distributeredis.redis_springboot.springboot_scheduletask.scheduletest1;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.text.DateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

// 在启动类上开启  @EnableScheduling定时任务注解
@RestController
@RequestMapping("/task")
public class ScheduleTaskController {

//    @PostMapping("/test")
//    @Scheduled(fixedRate = 5 * 1000)  // 5秒执行一次
//    public void testSchedule() {
//        System.out.println("定时任务1"+ DateFormat.getDateTimeInstance().format(new Date()));
//    }

    /**
     * ScheduleExecutorService的优点
     * 基于线程池，某个任务的执行情况不会影响其他定时任务的执行。
     */
    @PostMapping("/test2")
    public void testSchedule1() {
        // 1、创建ScheduledExecutorService线程池，做定时器
        ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);

        // 2、开启定时任务
        pool.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "执行输出：AAA  ==》 " + new Date());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, 0, 2, TimeUnit.SECONDS);


        pool.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "执行输出：BBB  ==》 " + new Date());
                System.out.println(10 / 0);
            }
        }, 0, 2, TimeUnit.SECONDS);


        pool.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "执行输出：CCC  ==》 " + new Date());
            }
        }, 0, 2, TimeUnit.SECONDS);
    }

    @PostMapping("/test3")
    public void testSchedule3() {
        //1、创建Timer定时器
        Timer timer = new Timer();//定时器本身就是一个单线程
        //2、调用方法，处理定时任务
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                //这里就是延时任务的业务逻辑
                System.out.println(Thread.currentThread().getName() + "执行一次--"+DateFormat.getDateTimeInstance().format(new Date()));
            }
        },3000,5000);
        //3000为启动后3秒执行，5000是每5秒执行一次
    }
}
